package arbre.utils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class Polyedre implements Serializable{
	private static final long serialVersionUID = 3977108098379520822L;
	
	public Point[] points;
	public String nom;
	public int z_order = 0;
	public String type;
	public String id;
	
	public List<String> osmIdRouteParcourus = new ArrayList<String>();
	
	List<String> intersections = new ArrayList<String>();
	
	public Polyedre() {
		
	}
	
	public Polyedre(Point[] points) {
		super();
		this.points = points;
	}

	public Point[] enveloppeConvexe(){
		Point[] res = null;

		//utilisation du parcours de graham
		//cf wikipedia

		//		Trouver le pivot P;
		//		Trier les points par angle (les points d'angle ��gal seront tri��s par rapport �� leur abscisse);
		//		 
		//		# Points[1] est le pivot, Points[longueur] aussi (fin du circuit)
		//		Pile.empiler(Points[1]);
		//		Pile.empiler(Points[2]);
		//		POUR i = 3 A Points.longueur
		//		        TANT QUE (Pile.hauteur >= 2) ET (Produit_vectoriel(Pile.second, Pile.haut, Points[i]) ��� 0)
		//		                Pile.d��piler;
		//		        FIN TANT QUE
		//		        Pile.empiler(Points[i]);
		//		FIN POUR
		//		 
		//		FONCTION Produit_vectoriel(p1, p2, p3)
		//		        RENVOYER(p2.x - p1.x)*(p3.y - p1.y) - (p3.x - p1.x)*(p2.y - p1.y); 
		//		FIN FONCTION
		Arrays.sort(points);
		//Arrays.sort(points, 1, points.length, points[0].POLAR_ORDER);

		return res;
	}
	
	
	public float produitVectoriel(Point p1, Point p2, Point p3){
		return (p2.getX() - p1.getX())*(p3.getY() - p1.getY()) - (p3.getX() - p1.getX())*(p2.getY() - p1.getY()); 
	}

	public int findPivot(Point [] points){
		float min = points[0].getY();
		int indexMin = 0;
		for(int i=1;i<points.length;i++){
			if(points[i].getY() < min){
				min = points[i].getY();
				indexMin=i;
			}
			else if(points[i].getY() == min && points[i].getX() < points[indexMin].getX()){
				min = points[i].getY();
				indexMin=i;

			}
		}
		return indexMin;
	}
	
	public String toString(){
		StringBuilder sb = new StringBuilder();
		
		sb.append("id :"+id+"\n");
		sb.append("nom :"+nom+"\n");
		sb.append("z_order :"+z_order+"\n");
		sb.append("type :"+type+"\n");
		
		sb.append("Points :[\n");
		
		for(Point p : points)
			sb.append(p.toString()+"\n");
		
		sb.append("]\n\n");
		
		return sb.toString();
	}
	
	public String toXml(){
		StringBuilder sb = new StringBuilder();
		
		sb.append("<polygone ");
		sb.append(" id=\"").append(id).append("\"");
		sb.append(" type=\"").append(type).append("\"");
		sb.append(" nom=\"").append(nom).append("\"");
		sb.append(">\n");
		
		for(Point p : points)
			sb.append(p.toXml()+"\n");
		
		for(String sId : intersections)
			sb.append("<chemin id=\"").append(sId).append("\"/>").append("\n");
		
		sb.append("</polygone>\n");
		
		return sb.toString();
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public List<String> getIntersections() {
		return intersections;
	}

	public void setIntersections(List<String> intersections) {
		this.intersections = intersections;
	}
	
	public void addIntersections(String intersection) {
		this.intersections.add(intersection);
	}
}
